#ifndef FPLAYER_CODEC_H
#define FPLAYER_CODEC_H


#include "IDecoder.h"
#include "IEncoder.h"

//枚举 编解码器的类型
enum CodecType {
  CodecType_AAC = 1,
  CodecType_H264MediaCodec,
  CodecType_X264,
};

/************************* 编解码器管理 *************************/
#ifdef __cplusplus
extern "C" {
#endif
/**
 * 创建解码器
 * @param param 解码器参数
 * @return 解码器
 */
IDecoder *
Codec_CreateDecoder(CodecType codecType, DecoderParam &param, IDecodeCallback *pDecoderCallback);

/**
 * 销毁解码器,并将ppDecoder置空
 * @param ppDecoder 解码器
 */
void Codec_DestroyDecoder(IDecoder **ppDecoder);

/**
 * 开始解码
 * @param pDecoder 解码器
 * @param pPacket 待解码的数据包
 * @return true:函数调用成功 false:反之
 */
bool Codec_StartDecode(IDecoder *pDecoder, AVPacket *pPacket);

/**
 * 创建编码器 如果是音频,则创建时不能使用param引用，所以EncoderParam内参数可以不用设置
 * @param param 编码器参数
 * @return 编码器
 */
IEncoder *
Codec_CreateEncoder(CodecType codecType, EncoderParam &param, IEncodeCallback *pEncoderCallback);

/**
 * 销毁编码器,并将ppEncoder置空
 * @param ppEncoder 编码器
 */
void Codec_DestroyEncoder(IEncoder **ppEncoder);

/**
 * 开始编码
 * @param pEncoder 编码器
 * @param pFrame 待编码的一帧数据
 * @return true:函数调用成功 false:反之
 */
bool Codec_StartEncode(IEncoder *pEncoder, AVFrame *pFrame);
#ifdef __cplusplus
}
#endif

#endif //FPLAYER_CODEC_H
